パラメータストアに保存した接続情報を使ってGA4のAPIをPythonで実行してみる
はじめに
データアナリティクス事業本部のkobayashiです。
Google AnalyticsのUniversalAnalytics(UA)が7月1日にて終了します。UAから変わるのがGoogleAnalytics(GA4)ですが、この変更によりUAで使用していたGoogle Analytics Reporting APIもGoogle Analytics Data API v1に移行する必要があります。
今回は以前UAで試してみた以下と同じ内容をGA4で試してみたいと思います。
Google Analytics Data APIでデータを取得する手順
Google Analytics Data APIを使ってGoogle Analyticsのデータを取得するには、
- Google Analytics Data APIの設定を行う
- クライアントライブラリをインストールする
- Pythonでコードを記述し実行する となります。
では初めに設定を行います。
Google Analytics Data APIを使う準備
Google Analytics Data APIを有効化する
Google Analytics Data APIを使ってGA4のデータを取得するためにはGoogleCloudのプロジェクトでサービスアカウントを作成することとGoogle Analytics Data APIをプロジェクトで有効にする必要があります。サービスアカウントについては以前作成したUA用のものを使った上でそのサービスアカウントに対してGoogle Analyticsでサービスアカウント用のユーザーに表示と分析の権限を与えている状態としますが、Google Analytics Data APIは今回新しく有効にする必要があります。
手順1)GoogleCloudにログインしAPIとサービス
へ進み、ライブラリ
を押下する。
手順2)検索フォームにAnalytics
と打ち込みGoogle Analytics Data API
を検索し、ライブラリの画面で有効にするを押下してライブラリを有効化する。
これでGoogle Analytics Data APIが有効になったので次にPythonでGA4のデータを取得してみたいと思います。
Analytics Data API用のクライアントライブラリのインストール
今回使うライブラリもpipにて簡単にインストールできますので下記のコマンドを実行します。
pip install google-analytics-data
以上でPythonにてGA4のデータを取得できる準備が整ったので実際にデータを取得するコードを記述します。
Analytics APIを使ってデータを取得する
以前はアナリティクス Reporting API v4のドキュメントのサンプルコードを元に「メトリックをページビュー、ディメンションをページパスとして、ページビューのデータを降順で取得 」していましたが今回も同じデータを取得してみたいと思います。
Analytics Data APIライブラリのドキュメントは「Python Client for Analytics Data API — google-analytics-data documentation 」 にありますのでこちらを参考にしつつコードを記述します。
またUAからGA4へ行う際にメトリックとディメンションがGA4用で変わっているので以下の公式ドキュメントを参考に以前のコードを読み替えます。
ユニバーサル アナリティクスと Google アナリティクス 4 で同等のディメンションと指標について | デベロッパーによる API の移行 | Google for Developers
またサービスアカウントの認証情報をローカルに保存してあるJsonファイルのパスから取得するのではなくAWS Systems Manager Parameter Storeに保存してそこから文字列として取得した上で、Analytics Data APIを使う際の認証情報として使用するようにします。
import json from pprint import pprint import boto3 from google.analytics.data_v1beta import BetaAnalyticsDataClient from google.analytics.data_v1beta.types import (DateRange, Dimension, Filter, FilterExpression, Metric, OrderBy, RunReportRequest) from google.protobuf.json_format import MessageToDict PARAM_KEY = "/ServiceAccountCredential/ga4-test" GA_PROPERTY_ID = '<REPLACE_WITH_PROPERTY_ID>' LIMIT = 10000 def initialize_analytics_reporting(): # パラメータストアからサービスアカウントの認証法を取得 ssm = boto3.client("ssm") service_account_key = json.loads( ssm.get_parameter(Name=PARAM_KEY, WithDecryption=True)["Parameter"]["Value"] ) return BetaAnalyticsDataClient.from_service_account_info(service_account_key) def get_report(analytics, offset=0): # パラメータ params = { "property": f"properties/{GA_PROPERTY_ID}", "limit": LIMIT, "offset": offset * LIMIT, "date_ranges": [DateRange(start_date="7daysAgo", end_date="today")], "metrics": [ Metric(name="screenPageViews"), ], "dimensions": [Dimension(name="pagePath"), Dimension(name="pageTitle")], "order_bys": [OrderBy(metric=OrderBy.MetricOrderBy(metric_name="screenPageViews"), desc=True)], } # GA4データの取得 response = analytics.run_report(RunReportRequest(**params)) # レスポンスをDictに変換 json_response = MessageToDict(response._pb) return json_response def get_response(response): metric_name = response['metricHeaders'][0]["name"] dimension_names = [_d["name"] for _d in response['dimensionHeaders']] rows = [{ metric_name: _r['metricValues'][0]['value'], dimension_names[0]: _r['dimensionValues'][0]['value'], dimension_names[1]: _r['dimensionValues'][1]['value'], } for _r in response.get("rows", [])] return rows, response.get("rowCount") def print_response(analytics): offset, row_count = 0, LIMIT rows = [] while offset < row_count or row_count is None: response = get_report(analytics, offset) r, row_count = get_response(response) rows.extend(r) offset += LIMIT pprint(rows) def main(): analytics = initialize_analytics_reporting() print_response(analytics) if __name__ == "__main__": main()
はじめにパラメータストアに保存してあるサービスアカウントを取得してAnalytics Data APIの認証情報として使うためにinitialize_analytics_reporting
関数を作成してあります。
次にUAとの違いはBetaAnalyticsDataAsyncClient.run_report
を使っているget_report
関数になります。run_report
の使い方は公式ドキュメント(BetaAnalyticsData — google-analytics-data documentation )に使い方が載っていますのでそちらを参考に行いました。
- paramsを指定する場合には
DateRange
、Metrics
など型をきちんと使用する run_report
で取得できるレスポンスがRunReportResponse
型で返ってくるのでMessageToDict(response._pb)
にてDictに変換して後続で使用する
と行った点が大きく異なります。
他の箇所も以前のUAのコードと変わっている部分がありますが主にリファクタリング目的なのでUAとGA4用のコードでのデータ取得という点では違いはありません。
上記のコードを実行して見ると以前と同じ形でデータが取得できます。
{'pagePath': '/', 'pageTitle': 'クラスメソッド発「やってみた」系技術メディア | DevelopersIO', 'screenPageViews': 'xxxxx'}, {'pagePath': '/articles/rds-bg-deploy/', 'pageTitle': '【衝撃】AWSのRDSがデータを失わないBlue/Greenデプロイに対応しました | DevelopersIO', 'screenPageViews': 'xxxxx'}, {'pagePath': '/articles/iphone_simplified_chart/', 'pageTitle': '[iPhone] 歴代iPhone早見表をまとめてみました(2022年前期時点) | DevelopersIO', 'screenPageViews': 'xxxxx'},
上記のコードのメトリックスとディメンションを公式ドキュメント を参考に色々変えることで今までと同じ用に様々なデータを取得することができますので欲しいデータの内容に書き換えて利用すれば良いかと思います。
まとめ
GA4のデータを簡単にPythonで扱えるPython Client for Analytics Data APIライブラリを使って以前UAで取得したデータを同じ形式でデータを取得してみました。UAのライブラリよりもPython Client for Analytics Data APIのライブラリの方がリクエストやレスポンスがわかりやすくなって使い勝手は向上しています。
最後まで読んで頂いてありがとうございました。